/*
 * File:   main.cpp
 * Author: Piotrek
 *
 * Created on 17 kwiecień 2010, 21:54
 */

/**
 * @mainpage
 * System antykolizyjny dla robotów przemysłowych
 * Projekt Grupowy nr 12\n
 * Katedra Systemów Sterowania\n
 * Wydział Elektroniki, Telekomunikacji i Informatyki\n
 * Politechnika Gdańska w Gdańsku
 *
 * @author Piotr Bocian 108742
 * @author Karol Czułkowski 108752
 * @author Adam Hryniewicz 108763\n
 *
 * See @ref todo\n
 * See @ref bug\n
 * repozytorium projektu: http://code.google.com/p/kss-pg-13/
 */


/**
 * @page todo List of TODO
 *
 * -# Estymacja polozenia robotow.
 * -# Wykrywanie kolizji.
 * -# Zamodelowanie tasmy produkcyjnej.
 * -# funkcja dokonujaca na biezaco transformacji (zerowej i rzeczywistej) obiektu:
    @n najpierw przetestowac czy dziala dla wszystkich typow przeksztalcen
    @n F5-F8 X,Y,Z,R
    @n F9-axis
    @n F11-F12 - raster
 *
 */

/**
 * @page bug List of BUGS
 */
#include "stdafx.h"
#include <cstdlib>
#include <stdio.h>
#include <iostream>
#include "Form1.h"

// classes:
#include "Robot.h"

#include "stdafx.h"
#include "StaticObject.h"
#include "Utils.h"


// zmienne globalne
int running = GL_TRUE;
bool pause=false;
bool coordinates=false;
bool grid=false;


GLfloat z0 = -150;


GLfloat xspeed;
GLfloat yspeed;


unsigned int selectedModule=0;


/**
 * Rysowanie sceny za pomoca OpenGL
 */
void DrawMainScene(void)
{

        // OpenGL rendering goes here...
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
        glLoadIdentity();
		/// @todo ponizsza linijka nie wiadomo skad sie bierze
		float z = RobotCollisionDetection::Form1::TranslateScene[2]*10;
		float x = RobotCollisionDetection::Form1::TranslateScene[0];
		float y = RobotCollisionDetection::Form1::TranslateScene[1];
		glTranslatef(x,y,z); // Translate Into/Out Of The Screen By z

		float xrot = RobotCollisionDetection::Form1::RotateScene[0];
		float yrot = RobotCollisionDetection::Form1::RotateScene[1];
		float zrot = RobotCollisionDetection::Form1::RotateScene[2];
        glRotatef(xrot, 1.0f, 0.0f, 0.0f); // Rotate On The X Axis
        glRotatef(yrot, 0.0f, 1.0f, 0.0f); // Rotate On The Y Axis
        glRotatef(zrot, 0.0f, 0.0f, 1.0f); // Rotate On The Z Axis

        //----------------------------------------------------------------------

        // polozenie obserwatora
        // gluLookAt (0.0, 0.0, 0.0, 0.0, 0.0, -100.0, 0.0, 1.0, 0.0);

        glScalef(0.05f,0.05f,0.05f);

        if (coordinates)
            showCoordinates();


        kawasaki->draw(1.0f, 1.0f, 0.0f);

        mitsubishi->draw(1.0f, 0.0f, 0.0f);

        #ifdef TASMA
        tasma->draw(0.0f, 1.0f, 1.0f);
        #endif



        //----------------------------------------------------------------------

        if (!pause)
        {
            xrot+=xspeed;		// X Axis Rotation
            yrot+=yspeed;   		// Y Axis Rotation
        }
   

}


/**
 * Inicjacja i konfiguracja OpenGL
 */
void InitOpenGL(void)
{				

    glShadeModel(GL_SMOOTH); // Enable Smooth Shading
    glClearColor(0.2f, 0.2f, 0.3f, 0.5f); // Black Background
    glClearDepth(1.0f); // Depth Buffer Setup
    glEnable(GL_DEPTH_TEST); // Enables Depth Testing   - brak tego powoduje dziwna perspektywe
    glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations

    // lighting
    glEnable(GL_NORMALIZE); // potrzebne do normalizacji swiatla

    //GLfloat LightAmbient[]= { 1.0f, 1.0f, 0.0f, 1.0f }; // Ambient Light Values ( NEW )
    GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f }; // Diffuse Light Values ( NEW )
    GLfloat LightPosition[]= { 0.0f, 0.0f, 2.0f, 1.0f }; // Light Position ( NEW )
    //glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); // Setup The Ambient Light
    glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); // Setup The Diffuse Light
    glLightfv(GL_LIGHT1, GL_POSITION,LightPosition); // Position The Light
    glEnable(GL_LIGHT1); // Enable Light One
    glEnable(GL_LIGHTING); // Enable Lighting

    #ifdef LIGHT2
    glEnable(GL_COLOR_MATERIAL);
    #endif
}
